import { reqCartList, reqDeleteCart, reqCheckCart } from '@/api'

export default {
  state: {
    cartList: []
  },
  mutations: {
    CARTLIST(state, cartList) {
      state.cartList = cartList
    }
  },
  actions: {
    // 获取购物车信息
    async cartList({ commit }) {
      const res = await reqCartList()
      if (res.code === 200) {
        commit('CARTLIST', res.data)
      }
    },
    // 删除单个购物车数据
    async deleteCart({ commit }, skuId) {
      const res = await reqDeleteCart(skuId)
      // 没有返回值要么成功要么失败
      if (res.code === 200) {
        // 返回费控字符串表示成功
        return 'ok'
      } else {
        return Promise.reject(new Error('faile'))
      }
    },
    // 修改单个商品选中状态
    async checkCart({ commit }, { skuId, isChecked }) {
      const res = await reqCheckCart(skuId, isChecked)
      if (res.code === 200) {
        return 'ok'
      } else {
        return Promise.reject(new Error('faile'))
      }
    },
    // 删除所有选中的商品数据
    // 参数context为store仓库 里面有{commit dispatch getters rootGetters state rootState}
    // 用{}解构出要用的方法或数据
    // deleteAllCheckedCart(context) {
    //   console.log(context)
    // }
    deleteAllCheckedCart({ dispatch, getters }) {
      // 遍历getters.cartList.cartInfoList, 让购物车带有isChecked调用deleteCart函数删除数据
      const promiseAll = []
      getters.cartList.cartInfoList.forEach((item) => {
        if (item.isChecked === 1) {
          const promise = dispatch('deleteCart', item.skuId) // 这里遍历cartInfoList的每个元素都返回promise（不止一个）
          // 这里调用deleteCart 返回值是一个promise对象 要么成功要么失败
          // 调用promise.all([p1, p2, p3]) 数组里三个都满足才能成功
          promiseAll.push(promise)
        }
      })
      return Promise.all(promiseAll)
    },
    // 修改所有商品的状态值
    updateAllChecked({ dispatch, state }, isChecked) {
      const promiseAll = []
      state.cartList[0].cartInfoList.forEach((item) => {
        // 返回的是一个promise对象
        const promise = dispatch('checkCart', { skuId: item.skuId, isChecked })
        promiseAll.push(promise)
      })
      return Promise.all(promiseAll)
    }
  },
  getters: {
    cartList(state) {
      return state.cartList[0] || {}
    }
  }
}
